home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / gui / MultiDesktop.lha / MultiDesktop / init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-27  |  26.3 KB  |  992 lines

  1. /* Initialisierung */
  2. #include "multiwindows.h"
  3.  
  4. extern struct IntuitionBase    *IntuitionBase;
  5. extern struct MultiDesktopBase *MultiDesktopBase;
  6. extern struct MultiWindowsBase *MultiWindowsBase;
  7. extern struct ExecBase         *SysBase;
  8. extern struct Library          *LocaleBase;
  9. extern struct Library          *UtilityBase;
  10.  
  11. struct Library                 *AmigaGuideBase;
  12. struct Library                 *AslBase;
  13.  
  14. extern ULONG FloatHookProc();
  15. extern ULONG HexHookProc();
  16. extern ULONG UserHookProc();
  17. extern ULONG AvailMem();
  18.  
  19. void         FlushFonts();
  20. void         TestFont();
  21. void         DOut();
  22. void         CloseGuide();
  23.  
  24. /*
  25.  LocaleLibrary Hinweis:
  26.  Wird vor dem Schließen der Locale-Library RemLibrary() aufgerufen,
  27.  so werden alle nicht mehr benötigten Kataloge freigegeben.
  28. */
  29.  
  30. void RemoveLib();
  31.  
  32. /* ---------------------------------------------------------------------- */
  33.  
  34. struct TextAttr Topaz8=
  35. { "topaz.font",8,FS_NORMAL,FPF_ROMFONT };
  36.  
  37. struct TextAttr Topaz8Bold=
  38. { "topaz.font",8,FSF_BOLD,FPF_ROMFONT };
  39.  
  40. struct TextAttr Password5=
  41. { "password.font",5,FS_NORMAL,FPF_ROMFONT };
  42.  
  43. struct TextAttr Password9=
  44. { "password.font",9,FS_NORMAL,FPF_ROMFONT };
  45.  
  46. struct CommandTable CommandTable[]=
  47. {
  48.  {"NumLock",'[',0},
  49.  {"ScrLock",']',0},
  50.  {"PrtSc"  ,'*',0},
  51.  {"Home"   ,'7',0},
  52.  {"PgUp"   ,'9',0},
  53.  {"End"    ,'1',0},
  54.  {"PgDown" ,'3',0},
  55.  {"Insert" ,'0',0},
  56.  {"Del"    ,'.',0},
  57.  {"Return" , 10,0},
  58.  {"ESC"    , 27,0},
  59.  {"Tab"    ,  9,0},
  60.  {"Enter"  , 10,0},
  61.  {"Star"   ,'*',0},
  62.  {"Number" ,'#',0},
  63.  {0L,0,0}
  64. };
  65.  
  66. UBYTE *FontTestString="abcdefghijklmnopqrstuvwxyz  -  1234567890 #,.;:*+^/*?!|$%&()= <> ABCDEFGHIJKLMNOPQRSTUVWXYZ öäüÄÖÜß";
  67.  
  68. /* ---------------------------------------------------------------------- */
  69. /* Interne Initialisation */
  70.  
  71. /* ---- Library initialisieren */
  72. struct MultiWindowsBase *InitLib()
  73. {
  74.  UBYTE str[128];
  75.  
  76.  /* ---- Libraries öffnen ----------------------------------------------- */
  77.  MultiWindowsBase->AslLibrary=OpenLibrary("asl.library",0L);
  78.  MultiWindowsBase->AmigaGuideLibrary=OpenLibrary("amigaguide.library",0L);
  79.  if(MultiWindowsBase->AslLibrary==NULL)
  80.   {
  81.    ErrorL(800,"Unable to open asl.library!");
  82.    return(NULL);
  83.   }
  84.  AslBase=MultiWindowsBase->AslLibrary;
  85.  AmigaGuideBase=MultiWindowsBase->AmigaGuideLibrary;
  86.  
  87.  /* ---- Zeiger auf Buffer setzen --------------------------------------- */
  88.  MultiWindowsBase->Preferences=&MultiWindowsBase->PreferencesBuffer;
  89.  MultiWindowsBase->UserInfo=&MultiWindowsBase->UserInfoBuffer;
  90.  strcpy(&MultiWindowsBase->UserInfo->Name,"?");
  91.  strcpy(&MultiWindowsBase->UserInfo->Address[0],"?");
  92.  strcpy(&MultiWindowsBase->UserInfo->PhoneNumber,"?");
  93.  strcpy(&MultiWindowsBase->UserInfo->FaxNumber,"?");
  94.  
  95.  /* ---- Preferences, Listen initialisieren ----------------------------- */
  96.  GetPrefs(MultiWindowsBase->Preferences,sizeof(struct Preferences));
  97.  NewList(&MultiWindowsBase->AppList);
  98.  NewList(&MultiWindowsBase->WallpaperList);
  99.  NewList(&MultiWindowsBase->PointerList);
  100.  
  101.  /* ---- Defaulteinstellungen ------------------------------------------- */
  102.  MultiWindowsBase->AppCount=0;
  103.  MultiWindowsBase->TopazAttr=&Topaz8;
  104.  MultiWindowsBase->Password9Attr=&Password9;
  105.  MultiWindowsBase->Password5Attr=&Password5;
  106.  MultiWindowsBase->DefaultAttr=&Topaz8;
  107.  MultiWindowsBase->DefaultNonPropAttr=&Topaz8;
  108.  MultiWindowsBase->WallpaperDir=WALLPAPER_DIR;
  109.  MultiWindowsBase->PointerDir=POINTER_DIR;
  110.  MultiWindowsBase->HelpTicks=HELP_TICKS;
  111.  MultiWindowsBase->HelpAvoidFlicker=HELP_AVOIDFLICKER;
  112.  MultiWindowsBase->HelpActive=HELP_ACTIVE;
  113.  MultiWindowsBase->HelpDeveloper=HELP_DEVELOPER;
  114.  MultiWindowsBase->HelpCorrY=HELP_CORR_Y;
  115.  MultiWindowsBase->HelpWallpaperName=HELP_WALLPAPERNAME;
  116.  MultiWindowsBase->HelpPointerName=HELP_POINTERNAME;
  117.  MultiWindowsBase->SleepPointerName=SLEEP_POINTERNAME;
  118.  MultiWindowsBase->WorkPointerName=WORK_POINTERNAME;
  119.  
  120.  MultiWindowsBase->CommandTable=&CommandTable;
  121.  MultiWindowsBase->MenuLineSpacing=MENU_LINESPACING;
  122.  MultiWindowsBase->MenuItemMove=MENU_ITEMMOVE;
  123.  MultiWindowsBase->MenuCommSeqSpacing=MENU_COMMSEQSPACING;
  124.  MultiWindowsBase->MenuBarChar=MENU_BARCHAR;
  125.  MultiWindowsBase->MenuSubString=MENU_SUBSTRING;
  126.  
  127.  MultiWindowsBase->TestString=FontTestString;
  128.  MultiWindowsBase->TestStringLength=strlen(FontTestString);
  129.  
  130.  /* ---- Externe Daten laden -------------------------------------------- */
  131.  MultiWindowsBase->TopazFont=OpenFont(MultiWindowsBase->TopazAttr);
  132.  if(MultiWindowsBase->TopazFont==NULL)
  133.   {
  134.    ErrorL(1040,"Unable to load font:\ntopaz.font 8");
  135.    RemoveLib();
  136.    return(NULL);
  137.   }
  138.  
  139.  MultiWindowsBase->Password5Font=OpenDiskFont(MultiWindowsBase->Password5Attr);
  140.  MultiWindowsBase->Password9Font=OpenDiskFont(MultiWindowsBase->Password9Attr);
  141.  if((MultiWindowsBase->Password5Font==NULL)||(MultiWindowsBase->Password9Font==NULL))
  142.   {
  143.    ErrorL(1022,"Unable to load font:\npassword.font 5 and 9");
  144.    RemoveLib();
  145.    return(NULL);
  146.   }
  147.  
  148.  MultiWindowsBase->DefaultFont=OpenDiskFont(MultiWindowsBase->DefaultAttr);
  149.  if(MultiWindowsBase->DefaultFont==NULL)
  150.   {
  151.    sprintf(&str,"%s:\n%s %ld",GetLStr(1101,"Unable to open font"),MultiWindowsBase->DefaultAttr->ta_Name,MultiWindowsBase->DefaultAttr->ta_YSize);
  152.    ErrorRequest(0,&str,0);
  153.    MultiWindowsBase->DefaultFont=MultiWindowsBase->TopazFont;
  154.    MultiWindowsBase->DefaultAttr=MultiWindowsBase->TopazAttr;
  155.   }
  156.  
  157.  MultiWindowsBase->DefaultNonPropFont=OpenDiskFont(MultiWindowsBase->DefaultNonPropAttr);
  158.  if(MultiWindowsBase->DefaultNonPropFont==NULL)
  159.   {
  160.    sprintf(&str,"%s:\n%s %ld",GetLStr(1101,"Unable to open font"),MultiWindowsBase->DefaultNonPropAttr->ta_Name,MultiWindowsBase->DefaultNonPropAttr->ta_YSize);
  161.    ErrorRequest(0,&str,0);
  162.    MultiWindowsBase->DefaultNonPropFont=MultiWindowsBase->TopazFont;
  163.    MultiWindowsBase->DefaultNonPropAttr=MultiWindowsBase->TopazAttr;
  164.   }
  165.  
  166.  if(MultiWindowsBase->HelpWallpaperName!=NULL)
  167.   {
  168.    MultiWindowsBase->HelpWallpaper=LoadWallpaper(MultiWindowsBase->HelpWallpaperName);
  169.    if(MultiWindowsBase->HelpWallpaper==NULL)
  170.      ErrorL(1029,"Unable to load help window wallpaper!");
  171.   }
  172.  
  173.  if(MultiWindowsBase->HelpPointerName!=NULL)
  174.   {
  175.    MultiWindowsBase->HelpPointer=LoadPointer(MultiWindowsBase->HelpPointerName);
  176.    if(MultiWindowsBase->HelpPointer==NULL)
  177.      ErrorL(1036,"Unable to load help pointer!");
  178.   }
  179.  
  180.  if(MultiWindowsBase->SleepPointerName!=NULL)
  181.   {
  182.    MultiWindowsBase->SleepPointer=LoadPointer(MultiWindowsBase->SleepPointerName);
  183.    if(MultiWindowsBase->SleepPointer==NULL)
  184.      ErrorL(1037,"Unable to load sleep pointer!");
  185.   }
  186.  
  187.  if(MultiWindowsBase->WorkPointerName!=NULL)
  188.   {
  189.    MultiWindowsBase->WorkPointer=LoadPointer(MultiWindowsBase->WorkPointerName);
  190.    if(MultiWindowsBase->WorkPointer==NULL)
  191.      ErrorL(1018,"Unable to load work pointer!");
  192.   }
  193.  
  194.  InitHook(&MultiWindowsBase->FloatHook,FloatHookProc,NULL);
  195.  InitHook(&MultiWindowsBase->HexHook,HexHookProc,NULL);
  196.  InitHook(&MultiWindowsBase->UserHook,UserHookProc,NULL);
  197.  ScanDisplayModes();
  198.  return(MultiWindowsBase);
  199. }
  200.  
  201. /* ---- Library entfernen */
  202. void RemoveLib()
  203. {
  204.  struct List      *list;
  205.  struct Node      *node,*succ;
  206.  struct Wallpaper *wp;
  207.  struct Pointer   *po;
  208.  
  209.  if(MultiWindowsBase->TopazFont)
  210.    CloseFont(MultiWindowsBase->TopazFont);
  211.  
  212.  if(MultiWindowsBase->Password5Font)
  213.   {
  214.    RemFont(MultiWindowsBase->Password5Font);
  215.    CloseFont(MultiWindowsBase->Password5Font);
  216.   }
  217.  
  218.  if(MultiWindowsBase->Password9Font)
  219.   {
  220.    RemFont(MultiWindowsBase->Password9Font);
  221.    CloseFont(MultiWindowsBase->Password9Font);
  222.   }
  223.  
  224.  list=&MultiWindowsBase->WallpaperList;
  225.  node=list->lh_Head;
  226.  while(node!=&list->lh_Tail)
  227.   {
  228.    succ=node->ln_Succ;
  229.    wp=node;
  230.    wp->UserCount=1;
  231.    UnLoadWallpaper(wp);
  232.    node=succ;
  233.   }
  234.  
  235.  list=&MultiWindowsBase->PointerList;
  236.  node=list->lh_Head;
  237.  while(node!=&list->lh_Tail)
  238.   {
  239.    succ=node->ln_Succ;
  240.    po=node;
  241.    po->UserCount=1;
  242.    UnLoadPointer(po);
  243.    node=succ;
  244.   }
  245.  
  246.  list=&MultiWindowsBase->VideoInfoList;
  247.  node=list->lh_Head;
  248.  while(node!=&list->lh_Tail)
  249.   {
  250.    succ=node->ln_Succ;
  251.    FreeMem(node,sizeof(struct VideoInfo));
  252.    node=succ;
  253.   }
  254.  
  255.  if(MultiWindowsBase->AslLibrary)
  256.    CloseLibrary(MultiWindowsBase->AslLibrary);
  257.  if(MultiWindowsBase->AmigaGuideLibrary)
  258.    CloseLibrary(MultiWindowsBase->AmigaGuideLibrary);
  259. }
  260.  
  261. /* ---- Neuer Benutzer-Task */
  262. struct MultiWindowsUser *InitWindowsUser(task)
  263.  struct Task *task;
  264. {
  265.  struct MultiDesktopUser *mu;
  266.  struct MultiWindowsUser *mw;
  267.  struct MultiDesktopBase *mdb;
  268.  UBYTE                    str[512];
  269.  int                      i;
  270.  
  271.  mdb=OpenLibrary("multidesktop.library",0);
  272.  if(mdb==NULL) return(NULL);
  273.  
  274.  if(task==NULL) task=SysBase->ThisTask;
  275.  mu=task->tc_UserData;
  276.  mw=mu->MultiWindows;
  277.  if(mw==NULL)
  278.   {
  279.    mw=AllocMem(sizeof(struct MultiWindowsUser),MEMF_CLEAR|MEMF_PUBLIC);
  280.    if(mw!=NULL)
  281.     {
  282.      mw->AppPort=CreatePort(0L,0L);
  283.      if(mw->AppPort==NULL)
  284.       {
  285.        FreeMem(mw,sizeof(struct MultiWindowsUser));
  286.        CloseLibrary(mdb);
  287.        return(NULL);
  288.       }
  289.      mw->MultiDesktopBase=mdb;
  290.      mw->UserCount=1;
  291.  
  292.      mw->FactorX=1.0;
  293.      mw->FactorY=1.0;
  294.      mw->OldFontH=792;
  295.      mw->OldFontV=8;
  296.      mw->NewFontH=792;
  297.      mw->NewFontV=8;
  298.      mw->TextAttr=MultiWindowsBase->TopazAttr;
  299.      mw->BoldTextAttr=&Topaz8Bold;
  300.      mw->TextFont=MultiWindowsBase->TopazFont;
  301.      mw->NonPropTextAttr=MultiWindowsBase->TopazAttr;
  302.      mw->NonPropTextFont=MultiWindowsBase->TopazFont;
  303.  
  304.      mw->SpaceSize=PixelLength(MultiWindowsBase->TopazFont," ");
  305.      mw->BarCharSize=mw->SpaceSize;   /* Topaz ist nicht proportional */
  306.      mw->SubStringSize=PixelLength(MultiWindowsBase->TopazFont,MultiWindowsBase->MenuSubString);
  307.  
  308.      mw->ActiveWindowID=-1;
  309.      NewList(&mw->AppObjectList);
  310.      NewList(&mw->CachedFontsList);
  311.      if(MultiWindowsBase->HelpActive) mw->HelpOn=TRUE;
  312.  
  313.      mw->Arguments=GetArgStr();
  314.      mw->OldTaskPriority=task->Node.ln_Pri;
  315.  
  316.      GetProgramName(&str,512);
  317.      i=strlen(&str)+2;
  318.      mw->ProgramName=ALLOC1(i);
  319.      if(mw->ProgramName==NULL) NoMemory();
  320.      strcpy(mw->ProgramName,&str);
  321.  
  322.      GetCurrentDirName(&str,512);
  323.      i=strlen(&str)+2;
  324.      mw->ProgramDirName=ALLOC1(i);
  325.      if(mw->ProgramDirName==NULL) NoMemory();
  326.      strcpy(mw->ProgramDirName,&str);
  327.  
  328.      mu->MultiWindows=mw;
  329.     }
  330.    else
  331.      CloseLibrary(mdb);
  332.   }
  333.  else
  334.   {
  335.    mw->UserCount++;
  336.   }
  337.  return(mw);
  338. }
  339.  
  340. /* ---- Benutzer-Task entfernen */
  341. void TerminateWindowsUser(task)
  342.  struct Task *task;
  343. {
  344.  struct MultiDesktopUser *mu;
  345.  struct MultiWindowsUser *mw;
  346.  struct MultiDesktopBase *mdb;
  347.  struct List             *list;
  348.  struct Node             *node,*succ;
  349.  int                      i;
  350.  
  351.  if(task==NULL) task=SysBase->ThisTask;
  352.  mu=task->tc_UserData;
  353.  mw=mu->MultiWindows;
  354.  
  355.  if(mw!=NULL)
  356.   {
  357.    mw->UserCount--;
  358.    if(mw->UserCount==0)
  359.     {
  360.      Forbid();
  361.      if(mw->UserNode.Node.ln_Succ) Remove(&mw->UserNode);
  362.      MultiWindowsBase->AppCount--;
  363.      Permit();
  364.  
  365.      for(i=0;i<MAXWINDOWS;i++)
  366.        if(mw->WindowList[i]) DeleteWindow(i);
  367.      for(i=0;i<MAXSCREENS;i++)
  368.        if(mw->ScreenList[i]) DeleteScreen(i);
  369.  
  370.      if(mw->Guide) CloseGuide();
  371.      if(mw->Catalog) CloseCatalog(mw->Catalog);
  372.      if(mw->Locale) CloseLocale(mw->Locale);
  373.      if(mw->Icon) FreeDiskObject(mw->Icon);
  374.      if((mw->TextFont)&&(mw->TextFont!=MultiWindowsBase->TopazFont)) CloseFont(mw->TextFont);
  375.      if((mw->NonPropTextFont)&&(mw->NonPropTextFont!=MultiWindowsBase->TopazFont)) CloseFont(mw->NonPropTextFont);
  376.  
  377.      if(mw->AppPort) DeletePort(mw->AppPort);
  378.      list=&mw->AppObjectList;
  379.      node=list->lh_Head;
  380.      while(node!=&list->lh_Tail)
  381.       {
  382.        succ=node->ln_Succ;
  383.        DeleteAppObject(node);
  384.        node=succ;
  385.       }
  386.  
  387.      FlushFonts();
  388.      SetTaskPri(SysBase->ThisTask,mw->OldTaskPriority);
  389.      FreeMemory(&mw->Remember);
  390.  
  391.      mdb=mw->MultiDesktopBase;
  392.      mu->MultiWindows=NULL;
  393.      FreeMem(mw,sizeof(struct MultiWindowsUser));
  394.      CloseLibrary(mdb);
  395.     }
  396.   }
  397. }
  398.  
  399. /* ---- Applikations-Info */
  400. BOOL AppInfo(name,version,catalog,oldFontH,oldFontV,font,npfont,icon,guide,tagList)
  401.  UBYTE            *name;
  402.  ULONG             version;
  403.  UBYTE            *catalog;
  404.  ULONG             oldFontH,oldFontV;
  405.  struct TextAttr  *font,*npfont;
  406.  
  407.  UBYTE            *icon;
  408.  
  409.  UBYTE            *guide;
  410.  struct TagItem  **tagList;
  411. {
  412.  BOOL                     bool;
  413.  UBYTE                    str[256];
  414.  UBYTE                   *arg;
  415.  UBYTE                   *language;
  416.  UBYTE                   *debugName;
  417.  ULONG                    j;
  418.  struct TagItem           tag[4];
  419.  struct MultiDesktopUser *mu;
  420.  struct MultiWindowsUser *mw;
  421.  struct WBStartup        *wbs;
  422.  struct Task             *task;
  423.  struct FileLock         *lock;
  424.  struct WBArg            *wbarg;
  425.  struct FileHandle       *debug;
  426.  int                      i;
  427.  
  428.  /* --- Zeiger initialisieren ---------------------------------------- */
  429.  USER;
  430.  mu=SysBase->ThisTask->tc_UserData;
  431.  wbs=mu->WBStartup;
  432.  mw->UserNode.Node.ln_Name=name;
  433.  mw->UserNode.Address=mw;
  434.  mw->UserNode.Version=version;
  435.  task=FindTask(NULL);
  436.  language=NULL;
  437.  
  438.  bool=GetTagData(AI_Req020,FALSE,tagList);
  439.  if((bool)&&(!(SysBase->AttnFlags & AFF_68020)))
  440.   { ErrorL(1124,"This program requires an 68020 processor!"); return(FALSE); }
  441.  
  442.  bool=GetTagData(AI_Req030,FALSE,tagList);
  443.  if((bool)&&(!(SysBase->AttnFlags & AFF_68030)))
  444.   { ErrorL(1125,"This program requires an 68030 processor!"); return(FALSE); }
  445.  
  446.  bool=GetTagData(AI_ReqFPU,FALSE,tagList);
  447.  if((bool)&&(!(SysBase->AttnFlags & AFF_68881)))
  448.   { ErrorL(1126,"This program requires an 68881 processor!"); return(FALSE); }
  449.  
  450.  bool=GetTagData(AI_ReqLocale,FALSE,tagList);
  451.  if((bool)&&(LocaleBase==NULL))
  452.   { ErrorL(1127,"This program requires Workbench 2.1 and Locale"); return(FALSE); }
  453.  
  454.  j=GetTagData(AI_MinStack,4096,tagList);
  455.  if((ULONG)task->tc_SPUpper-(ULONG)task->tc_SPLower<j)
  456.   {
  457.    sprintf(&str,FindID(mu->Catalog,"1128:This program requires a stack of %ld bytes."),j);
  458.    ErrorRequest(0,&str,"1130:Ignore?!|Quit program!");
  459.    if(j==0) return(FALSE);
  460.   }
  461.  
  462.  j=GetTagData(AI_MinMemory,0,tagList);
  463.  if((AvailMem(MEMF_ANY))<j)
  464.   {
  465.    sprintf(&str,FindID(mu->Catalog,"1129:This program requires %ld KBytes\nof free memory!"),j/1024);
  466.    j=ErrorRequest(0,&str,"1130:Ignore?!|Quit program!");
  467.    if(j==0) return(FALSE);
  468.   }
  469.  
  470.  j=GetTagData(AI_MinChipMem,0,tagList);
  471.  if((AvailMem(MEMF_CHIP))<j)
  472.   {
  473.    sprintf(&str,FindID(mu->Catalog,"1131:This program requires %ld KBytes\nof free chip memory!"),j/1024);
  474.    j=ErrorRequest(0,&str,"1130:Ignore?!|Quit program!");
  475.    if(j==0) return(FALSE);
  476.   }
  477.  
  478.  j=GetTagData(AI_MinOSVersion,0,tagList);
  479.  if(SysBase->LibNode.lib_Version<j)
  480.   {
  481.    sprintf(&str,FindID(mu->Catalog,"1132:This program requires DOS version %ld!"),j);
  482.    j=ErrorRequest(0,&str,0);
  483.    return(FALSE);
  484.   }
  485.  
  486.  mw->HasMenuHelp=1;
  487.  mw->HasGadgetHelp=1;
  488.  
  489. /*
  490.  j=GetTagData(AI_NoGadgetHelp,0,tagList);
  491.  if(j==0) mw->HasGadgetHelp=1;
  492.  
  493.  j=GetTagData(AI_NoMenuHelp,0,tagList);
  494.  if(j==0) mw->HasMenuHelp=1;
  495. */
  496.  
  497.  if(font)
  498.    CopyMemQuick(font,&mw->TABuffer[0],sizeof(struct TextAttr));
  499.  else
  500.    CopyMemQuick(MultiWindowsBase->DefaultAttr,&mw->TABuffer[0],sizeof(struct TextAttr));
  501.  mw->TextAttr=&mw->TABuffer[0];
  502.  
  503.  if(npfont)
  504.    CopyMemQuick(npfont,&mw->TABuffer[2],sizeof(struct TextAttr));
  505.  else
  506.    CopyMemQuick(MultiWindowsBase->DefaultNonPropAttr,&mw->TABuffer[2],sizeof(struct TextAttr));
  507.  mw->NonPropTextAttr=&mw->TABuffer[2];
  508.  
  509.  /* --- WBStartup, CLI-Startup, Icon laden ------------------------------ */
  510.  if(wbs==NULL)
  511.    mw->Icon=GetDiskObject(mw->ProgramName);
  512.  else
  513.   {
  514.    wbarg=wbs->sm_ArgList;
  515.    if(wbarg->wa_Lock)
  516.     {
  517.      lock=CurrentDir(wbarg->wa_Lock);
  518.      mw->Icon=GetDiskObject(wbarg->wa_Name);
  519.      CurrentDir(lock);
  520.     }
  521.    mw->WorkbenchStartup=TRUE;
  522.   }
  523.  
  524.  debugName=NULL;
  525.  if(mw->Icon==NULL)
  526.   { mw->Icon=GetDefDiskObject(WBTOOL); }
  527.  else
  528.   {
  529.    arg=FindToolType(mw->Icon->do_ToolTypes,"CATALOG");
  530.    if(arg)
  531.     {
  532.      mw->TaskPriority=atol(arg);
  533.      mw->OldTaskPriority=SetTaskPri(task,mw->TaskPriority);
  534.     }
  535.    arg=FindToolType(mw->Icon->do_ToolTypes,"CATALOG");
  536.    if(arg) catalog=arg;
  537.    arg=FindToolType(mw->Icon->do_ToolTypes,"LANGUAGE");
  538.    if(arg) language=arg;
  539.    arg=FindToolType(mw->Icon->do_ToolTypes,"GUIDE");
  540.    if(arg) guide=arg;
  541.    arg=FindToolType(mw->Icon->do_ToolTypes,"DEBUG");
  542.    if(arg) debugName=arg;
  543.    arg=FindToolType(mw->Icon->do_ToolTypes,"FONT.NAME");
  544.    if(arg) mw->TextAttr->ta_Name=arg;
  545.    arg=FindToolType(mw->Icon->do_ToolTypes,"FONT.SIZE");
  546.    if(arg) mw->TextAttr->ta_YSize=atol(arg);
  547.    arg=FindToolType(mw->Icon->do_ToolTypes,"NONPROPFONT.NAME");
  548.    if(arg) mw->NonPropTextAttr->ta_Name=arg;
  549.    arg=FindToolType(mw->Icon->do_ToolTypes,"NONPROPFONT.SIZE");
  550.    if(arg) mw->NonPropTextAttr->ta_YSize=atol(arg);
  551.   }
  552.  
  553.  if(debugName)
  554.    debug=Open(debugName,MODE_NEWFILE);
  555.  else
  556.    debug=NULL;
  557.  
  558.  if(mw->Icon)
  559.   {
  560.    mw->ToolTypes=mw->Icon->do_ToolTypes;
  561.    mw->Icon->do_CurrentX=NO_ICON_POSITION;
  562.    mw->Icon->do_CurrentY=NO_ICON_POSITION;
  563.   }
  564.  mw->GuideName=guide;
  565.  if(mw->GuideName) DOut(debug,"(+) Guide file is <%s>.\n",mw->GuideName);
  566.  
  567.  /* --- Locale und Katalog öffnen ------------------------------------ */
  568.  if((catalog)&&(LocaleBase))
  569.   {
  570.    mw->Locale=OpenLocale(NULL);
  571.    if(mw->Locale!=NULL)
  572.     {
  573.      DOut(debug,"(+) Locale at $%lx\n",mw->Locale);
  574.      if(language)
  575.       {
  576.        tag[0].ti_Tag=OC_Language;
  577.        tag[0].ti_Data=language;
  578.        tag[1].ti_Tag=TAG_DONE;
  579.       }
  580.      else
  581.        tag[0].ti_Tag=TAG_DONE;
  582.  
  583.      mw->Catalog=OpenCatalogA(mw->Locale,catalog,&tag);
  584.      if(mw->Catalog==NULL)
  585.       {
  586.        GetCurrentDirName(&str,256);
  587.        AddPart(&str,catalog,510);
  588.        mw->Catalog=OpenCatalogA(mw->Locale,&str,&tag);
  589.       }
  590.      if(mw->Catalog)
  591.        DOut(debug,"(+) Catalog <%s> at $%lx\n",catalog,mw->Catalog);
  592.      else
  593.        DOut(debug,"(-) Unable to open catalog <%s>!",catalog);
  594.     }
  595.    else
  596.      DOut(debug,"(!) Unable to allocate locale!");
  597.   }
  598.  else
  599.   {
  600.    if(LocaleBase==NULL) {
  601.      DOut(debug,"(-) No locale.library!\n"); }
  602.   }
  603.  
  604.  /* --- Zeichensatz öffnen ------------------------------------------- */
  605.  mw->OldFontH=oldFontH;
  606.  mw->OldFontV=oldFontV;
  607.  
  608.  mw->TextFont=OpenDiskFont(mw->TextAttr);
  609.  if(mw->TextFont==NULL)
  610.   {
  611.    sprintf(&str,"%s:\n%s %ld",GetLStr(1101,"Unable to open font"),mw->TextAttr->ta_Name,mw->TextAttr->ta_YSize);
  612.    ErrorRequest("1100:AppInfo()-Warning",&str,"1012:Continue");
  613.    mw->TextAttr=MultiWindowsBase->TopazAttr;
  614.    mw->TextFont=MultiWindowsBase->TopazFont;
  615.    DOut(debug,"(-) Unable to load font <%s/%ld>, using topaz/8.\n",mw->TextAttr->ta_Name,mw->TextAttr->ta_YSize);
  616.   }
  617.  else
  618.    DOut(debug,"(+) Font <%s/%ld> at $%lx.\n",mw->TextAttr->ta_Name,mw->TextAttr->ta_YSize,mw->TextFont);
  619.  
  620.  mw->NonPropTextFont=OpenDiskFont(mw->NonPropTextAttr);
  621.  if(mw->NonPropTextFont==NULL)
  622.   {
  623.    sprintf(&str,"%s:\n%s %ld",GetLStr(1101,"Unable to open font"),mw->NonPropTextAttr->ta_Name,mw->NonPropTextAttr->ta_YSize);
  624.    ErrorRequest("1100:AppInfo()-Warning",&str,"1012:Continue");
  625.    mw->NonPropTextAttr=MultiWindowsBase->TopazAttr;
  626.    mw->NonPropTextFont=MultiWindowsBase->TopazFont;
  627.    DOut(debug,"(-) Unable to load font <%s/%ld>, using topaz/8.\n",mw->NonPropTextAttr->ta_Name,mw->TextAttr->ta_YSize);
  628.   }
  629.  else
  630.    DOut(debug,"(+) Font <%s/%ld> at $%lx.\n",mw->NonPropTextAttr->ta_Name,mw->TextAttr->ta_YSize,mw->NonPropTextFont);
  631.  
  632.  CopyMemQuick(mw->TextAttr,&mw->TABuffer[1],sizeof(struct TextAttr));
  633.  mw->BoldTextAttr=&mw->TABuffer[1];
  634.  mw->BoldTextAttr->ta_Style |= FSF_BOLD;
  635.  
  636.  /* --- Zeichenlängen für Space und Bar-Zeichen ermitteln ------------ */
  637.  mw->SpaceSize=PixelLength(mw->TextFont," ");
  638.  if(mw->SpaceSize==0) mw->SpaceSize=1;
  639.  DOut(debug,"(+) Space size is %ld.\n",mw->SpaceSize);
  640.  
  641.  str[0]=MultiWindowsBase->MenuBarChar;
  642.  str[1]=0x00;
  643.  mw->BarCharSize=PixelLength(mw->TextFont,&str);
  644.  if(mw->BarCharSize==0)
  645.   {    /* Zeichensatz ohne MenuBarChar (·) */
  646.    MultiWindowsBase->MenuBarChar='-';
  647.    mw->BarCharSize=PixelLength(mw->TextFont,"-");
  648.    if(mw->BarCharSize==0)
  649.     {  /* Zeichensatz ohne Minus-Zeichen?! */
  650.      MultiWindowsBase->MenuBarChar=' ';
  651.      mw->BarCharSize=10;
  652.     }
  653.   }
  654.  DOut(debug,"(+) Bar char <%c> size is %ld.\n",MultiWindowsBase->MenuBarChar,mw->BarCharSize);
  655.  
  656.  mw->SubStringSize=PixelLength(mw->TextFont,MultiWindowsBase->MenuSubString);
  657.  if(mw->SubStringSize==0)
  658.   { /* Zeichensatz ohne SubItem-Zeichen (») */
  659.    MultiWindowsBase->MenuSubString=" ";
  660.    mw->SubStringSize=mw->SpaceSize;
  661.   }
  662.  DOut(debug,"(+) Sub string <%s> size is %ld.\n",MultiWindowsBase->MenuSubString,mw->SubStringSize);
  663.  
  664.  /* --- Streckungsfaktoren berechnen --------------------------------- */
  665.  TestFont(mw->TextFont,&mw->NewFontH,&mw->NewFontV);
  666.  DOut(debug,"(+) Developer's font: H=%ld  V=%ld\n",mw->OldFontH,mw->OldFontV);
  667.  DOut(debug,"(+) Your font:        H=%ld  V=%ld\n",mw->NewFontH,mw->NewFontV);
  668.  
  669.  mw->FactorX=(FLOAT)mw->NewFontH/(FLOAT)mw->OldFontH;
  670.  mw->FactorY=(FLOAT)mw->NewFontV/(FLOAT)mw->OldFontV;
  671.  DOut(debug,"(+) FactorX=%1.1f  FactorY=%1.1f\n",mw->FactorX,mw->FactorY);
  672.  
  673.  /* --- Applikation in Applikationsliste einfügen -------------------- */
  674.  Forbid();
  675.  AddTail(&MultiWindowsBase->AppList,&mw->UserNode);
  676.  MultiWindowsBase->AppCount++;
  677.  Permit();
  678.  DOut(debug,"(+) Application added to application list.\n");
  679.  
  680.  if(debug) Close(debug);
  681.  return(TRUE);
  682. }
  683.  
  684. /* ---- Hook-Zeichenkopierroutine */
  685. ULONG CopyProc(hook,obj,msg)
  686.  struct Hook *hook;
  687.  ULONG        obj;
  688.  ULONG        msg;
  689. {
  690.  UBYTE *buffer;
  691.  
  692.  buffer=hook->h_Data;
  693.  buffer[0]=(UBYTE)msg;
  694.  hook->h_Data=(ULONG)buffer+1L;
  695. }
  696.  
  697. /* ---- String-Formatierung */
  698. BOOL LocaleSFormat(buffer,formatString,args)
  699.  UBYTE *buffer;
  700.  UBYTE *formatString;
  701.  ULONG *args;
  702. {
  703.  struct MultiWindowsUser *mw;
  704.  struct Hook              hook;
  705.  
  706.  USER;
  707.  if(mw->Locale!=NULL)
  708.   {
  709.    InitHook(&hook,CopyProc,buffer);
  710.    FormatString(mw->Locale,formatString,args,&hook);
  711.    return(TRUE);
  712.   }
  713.  strcpy(buffer,"«No Locale!»");
  714.  return(FALSE);
  715. }
  716.  
  717. /* ---- Datums-Formatierung */
  718. BOOL LocaleDFormat(buffer,formatString,date)
  719.  UBYTE            *buffer;
  720.  UBYTE            *formatString;
  721.  struct DateStamp *date;
  722. {
  723.  struct MultiWindowsUser *mw;
  724.  struct Hook              hook;
  725.  
  726.  USER;
  727.  if(mw->Locale!=NULL)
  728.   {
  729.    InitHook(&hook,CopyProc,buffer);
  730.    FormatDate(mw->Locale,formatString,date,&hook);
  731.    return(TRUE);
  732.   }
  733.  strcpy(buffer,"«No Locale V38»");
  734.  return(FALSE);
  735. }
  736.  
  737. /* ---- Applikationsdaten */
  738. APTR GetLocale()
  739. {
  740.  struct MultiWindowsUser *mw;
  741.  USER;
  742.  return(mw->Locale);
  743. }
  744.  
  745. /* ---- Applikationsdaten */
  746. APTR GetCatalog()
  747. {
  748.  struct MultiWindowsUser *mw;
  749.  USER;
  750.  return(mw->Catalog);
  751. }
  752.  
  753. /* ---- Applikationsdaten */
  754. UBYTE *GetGuide()
  755. {
  756.  struct MultiWindowsUser *mw;
  757.  USER;
  758.  return(mw->GuideName);
  759. }
  760.  
  761. /* ---- Applikationsdaten */
  762. UBYTE *GetProgName()
  763. {
  764.  struct MultiWindowsUser *mw;
  765.  USER;
  766.  return(mw->ProgramName);
  767. }
  768.  
  769. /* ---- Applikationsdaten */
  770. UBYTE *GetProgDirName()
  771. {
  772.  struct MultiWindowsUser *mw;
  773.  USER;
  774.  return(mw->ProgramDirName);
  775. }
  776.  
  777. /* ---- Applikationsdaten */
  778. UBYTE *GetArguments()
  779. {
  780.  struct MultiWindowsUser *mw;
  781.  USER;
  782.  return(mw->Arguments);
  783. }
  784.  
  785. /* ---- Applikationsdaten */
  786. UBYTE *GetWBStartup()
  787. {
  788.  struct MultiDesktopUser *mu;
  789.  mu=SysBase->ThisTask->tc_UserData;
  790.  return(mu->WBStartup);
  791. }
  792.  
  793. /* ---- Applikationsdaten */
  794. UBYTE **GetToolTypes()
  795. {
  796.  struct MultiWindowsUser *mw;
  797.  USER;
  798.  return(mw->ToolTypes);
  799. }
  800.  
  801. /* ---- Zeichensatz testen */
  802. void TestFont(font,h,v)
  803.  struct TextFont *font;
  804.  ULONG           *h,*v;
  805. {
  806.  struct RastPort rp;
  807.  
  808.  InitRastPort(&rp);
  809.  SetFont(&rp,font);
  810.  *h=TextLength(&rp,MultiWindowsBase->TestString,MultiWindowsBase->TestStringLength);
  811.  *v=font->tf_YSize;
  812. }
  813.  
  814. /* ---- Debug-Ausgabe */
  815. void DOut(fh,text,a1,a2,a3)
  816.  struct FileHandle *fh;
  817.  UBYTE             *text;
  818.  ULONG              a1,a2,a3;
  819. {
  820.  UBYTE buf[200];
  821.  
  822.  if(fh) {
  823.    sprintf(&buf,text,a1,a2,a3);
  824.    Write(fh,&buf,strlen(&buf)); }
  825. }
  826.  
  827. /* ---- Font cachen */
  828. struct TextFont *CacheFont(name,size)
  829.  UBYTE *name;
  830.  UWORD  size;
  831. {
  832.  struct TextFont         *font;
  833.  struct CachedFont       *cf;
  834.  struct Node             *node;
  835.  struct MultiWindowsUser *mw;
  836.  struct TextAttr          ta;
  837.  
  838.  USER;
  839.  for(node=mw->CachedFontsList.lh_Head;node!=&mw->CachedFontsList.lh_Tail;node=node->ln_Succ)
  840.   {
  841.    cf=node;
  842.    if(!(strcmp(name,node->ln_Name))) {
  843.      if(cf->Height==size) {
  844.        return(cf->TextFont);
  845.       }
  846.     }
  847.   }
  848.  
  849.  cf=ALLOC1(sizeof(struct CachedFont));
  850.  if(cf!=NULL)
  851.   {
  852.    ta.ta_Name=name;
  853.    ta.ta_YSize=size;
  854.    ta.ta_Style=FS_NORMAL;
  855.    ta.ta_Flags=FPF_DISKFONT;
  856.    font=OpenDiskFont(&ta);
  857.    if(font==NULL)
  858.     {
  859.      FREE1(cf);
  860.      return(NULL);
  861.     }
  862.  
  863.    cf->Node.ln_Name=font->tf_Message.mn_Node.ln_Name;
  864.    cf->Height=font->tf_YSize;
  865.    cf->TextFont=font;
  866.  
  867.    AddHead(&mw->CachedFontsList,cf);
  868.    return(font);
  869.   }
  870.  return(NULL);
  871. }
  872.  
  873. /* ---- Font aus Cache entfernen */
  874. void FlushFont(name,size)
  875.  UBYTE *name;
  876.  UWORD  size;
  877. {
  878.  struct CachedFont       *cf;
  879.  struct Node             *node;
  880.  struct MultiWindowsUser *mw;
  881.  
  882.  USER;
  883.  for(node=mw->CachedFontsList.lh_Head;node!=&mw->CachedFontsList.lh_Tail;node=node->ln_Succ)
  884.   {
  885.    cf=node;
  886.    if(!(strcmp(name,node.ln_Name))) {
  887.      if(cf->Height==size) {
  888.        Remove(cf);
  889.        CloseFont(cf->TextFont);
  890.        FREE1(cf);
  891.        return;
  892.       }
  893.     }
  894.   }
  895. }
  896.  
  897. /* ---- Alls Fonts aus Cache entfernen */
  898. void FlushFonts()
  899. {
  900.  struct MultiWindowsUser *mw;
  901.  struct CachedFont       *cf;
  902.  struct Node             *node,*succ;
  903.  struct List             *list;
  904.  
  905.  USER;
  906.  list=&mw->CachedFontsList;
  907.  node=list->lh_Head;
  908.  
  909.  while(node!=&list->lh_Tail)
  910.   {
  911.    succ=node->ln_Succ;
  912.    cf=node;
  913.    CloseFont(cf->TextFont);
  914.    FREE1(cf);
  915.    node=succ;
  916.   }
  917.  
  918.  NewList(&mw->CachedFontsList);
  919. }
  920.  
  921. UBYTE *GuideContext[]={"MAIN",NULL};
  922.  
  923. /* ---- AmigaGuide-Datei öffnen */
  924. void OpenGuide()
  925. {
  926.  struct MultiWindowsUser *mw;
  927.  
  928.  USER;
  929.  if((AmigaGuideBase!=NULL)&&(mw->GuideName!=NULL))
  930.   {
  931.    if(mw->Guide==NULL)
  932.     {
  933.      ClearMemQuick(&mw->AmigaGuideBuffer,sizeof(struct NewAmigaGuide));
  934.      mw->AmigaGuideBuffer.nag_Name=mw->GuideName;
  935. /*     mw->AmigaGuideBuffer.nag_BaseName=mw->ProgramName; */
  936.      mw->AmigaGuideBuffer.nag_Context=&GuideContext;
  937.  
  938.      mw->Guide=OpenAmigaGuideAsync(&mw->AmigaGuideBuffer,NULL);
  939.      if(mw->Guide!=NULL)
  940.       {
  941.        mw->GuideSignalMask=AmigaGuideSignal(mw->Guide);
  942.        mw->GuideReady=FALSE;
  943.        mw->GuideCommand=FALSE;
  944.        SetAmigaGuideContext(mw->Guide,NULL,NULL);
  945.       }
  946.      else
  947.        ErrorL(1134,"OpenAmigaGuideAsync(): Unable to load guide file!");
  948.     }
  949.   }
  950.  else
  951.    ErrorL(1133,"AmigaGuide is not installed!");
  952. }
  953.  
  954. /* ---- AmigaGuide schließen */
  955. void CloseGuide()
  956. {
  957.  struct MultiWindowsUser *mw;
  958.  struct AmigaGuideMsg    *agm;
  959.  
  960.  USER;
  961.  if(mw->Guide)
  962.   {
  963.    agm=GetAmigaGuideMsg(mw->Guide);
  964.    while(agm!=NULL)
  965.     {
  966.      ReplyAmigaGuideMsg(agm);
  967.      agm=GetAmigaGuideMsg(mw->Guide);
  968.     }
  969.    CloseAmigaGuide(mw->Guide);
  970.    mw->GuideSignalMask=0;
  971.    mw->Guide=NULL;
  972.   }
  973. }
  974.  
  975. /* ---- AmigaGuide öffnen und anzeigen */
  976. void ShowGuide()
  977. {
  978.  struct MultiWindowsUser *mw;
  979.  
  980.  USER;
  981.  if(mw->Guide==NULL) OpenGuide();
  982.  if(mw->Guide)
  983.   {
  984.    SetAmigaGuideContext(mw->Guide,NULL,NULL);
  985.    if(mw->GuideReady)
  986.      SendAmigaGuideContext(mw->Guide,NULL);
  987.    else
  988.      mw->GuideCommand=TRUE;
  989.   }
  990. }
  991.  
  992.